import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * 图片压缩工具类，用于将图片批量压缩到指定大小以下
 */
public class ImageCompressor {
    // 常量定义
    private static final String INPUT_FOLDER = "input_images";  // 输入图片文件夹路径
    private static final String OUTPUT_FOLDER = "output_images"; // 输出图片文件夹路径
    private static final long MAX_SIZE = 100 * 1024; // 最大文件大小限制(100KB)

    /**
     * 主方法，程序入口
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        File inputDir = new File(INPUT_FOLDER);  // 输入文件夹对象
        File outputDir = new File(OUTPUT_FOLDER); // 输出文件夹对象
        
        // 如果输出文件夹不存在则创建
        if (!outputDir.exists()) {
            outputDir.mkdir();
        }

        // 检查输入文件夹是否存在且是目录
        if (inputDir.exists() && inputDir.isDirectory()) {
            // 获取文件夹中所有支持的图片文件(JPG,JPEG,PNG,BMP)
            File[] imageFiles = inputDir.listFiles((dir, name) -> 
                name.endsWith(".jpg") || name.endsWith(".jpeg") || 
                name.endsWith(".png") || name.endsWith(".bmp"));
            
            // 如果找到图片文件则逐个处理
            if (imageFiles != null) {
                for (File imageFile : imageFiles) {
                    try {
                        compressImage(imageFile, outputDir); // 调用压缩方法
                    } catch (IOException e) {
                        System.err.println("Error processing " + imageFile.getName() + ": " + e.getMessage());
                    }
                }
            }
        } else {
            System.err.println("Input folder does not exist: " + INPUT_FOLDER);
        }
    }

    /**
     * 压缩图片方法，通过调整质量和尺寸将图片压缩到指定大小以下
     * @param inputFile 输入图片文件
     * @param outputDir 输出目录
     * @throws IOException 如果发生I/O错误
     */
    private static void compressImage(File inputFile, File outputDir) throws IOException {
        BufferedImage originalImage = ImageIO.read(inputFile); // 读取原始图片
        float quality = 0.9f; // 初始压缩质量(90%)
        
        // 循环压缩直到文件大小符合要求
        do {
            // 创建新的缓冲图像对象
            BufferedImage compressedImage = new BufferedImage(
                originalImage.getWidth(), 
                originalImage.getHeight(), 
                BufferedImage.TYPE_INT_RGB);
            
            // 绘制压缩后的图像
            Graphics2D g2d = compressedImage.createGraphics();
            g2d.drawImage(originalImage, 0, 0, null);
            g2d.dispose();

            // 输出文件路径
            File outputFile = new File(outputDir, inputFile.getName());
            ImageIO.write(compressedImage, "jpg", outputFile); // 保存为JPG格式
            
            // 检查文件大小是否超过限制
            if (outputFile.length() > MAX_SIZE) {
                quality -= 0.1f; // 每次降低10%质量
                if (quality <= 0.1f) {
                    // 如果质量降到最低仍太大，则调整图片尺寸
                    int newWidth = (int)(originalImage.getWidth() * 0.9); // 宽度缩小10%
                    int newHeight = (int)(originalImage.getHeight() * 0.9); // 高度缩小10%
                    originalImage = resizeImage(originalImage, newWidth, newHeight);
                    quality = 0.9f; // 重置压缩质量
                }
            } else {
                break; // 文件大小符合要求，退出循环
            }
        } while (true);
    }

    /**
     * 调整图片尺寸方法
     * @param originalImage 原始图片
     * @param width 新宽度
     * @param height 新高度
     * @return 调整尺寸后的图片
     */
    private static BufferedImage resizeImage(BufferedImage originalImage, int width, int height) {
        // 使用平滑缩放算法调整图片尺寸
        Image resultingImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
        BufferedImage outputImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        outputImage.getGraphics().drawImage(resultingImage, 0, 0, null);
        return outputImage;
    }
}